﻿using Infrastructure.Constant;

namespace BUGCOME.Infrastructure.Model
{
    /// <summary>
    /// API响应结果类，继承自Dictionary用于构建统一格式的API响应
    /// 提供了状态码、消息、数据和成功标识等标准响应字段
    /// </summary>
    public class ApiResult : Dictionary<string, object>
    {
        /// <summary>
        /// 状态码字段名称常量
        /// </summary>
        public static readonly string CODE_TAG = "code";

        /// <summary>
        /// 返回消息字段名称常量
        /// </summary>
        public static readonly string MSG_TAG = "msg";

        /// <summary>
        /// 数据对象字段名称常量
        /// </summary>
        public static readonly string DATA_TAG = "data";

        /// <summary>
        /// 成功标识字段名称常量
        /// </summary>
        public static readonly string SUCCESS_TAG = "success";

        /// <summary>
        /// 初始化一个新创建的APIResult对象，使其表示一个空消息
        /// </summary>
        public ApiResult()
        {
        }

        /// <summary>
        /// 初始化一个新创建的 ApiResult 对象
        /// </summary>
        /// <param name="code">状态码</param>
        /// <param name="msg">返回消息</param>
        public ApiResult(int code, string msg)
        {
            Add(CODE_TAG, code);
            Add(SUCCESS_TAG, code == 200 ? true : false);
            Add(MSG_TAG, msg);
        }

        /// <summary>
        /// 初始化一个新创建的 ApiResult 对象
        /// </summary>
        /// <param name="code">状态码</param>
        /// <param name="msg">返回消息</param>
        /// <param name="data">响应数据</param>
        public ApiResult(int code, string msg, object data)
        {
            Add(CODE_TAG, code);
            Add(SUCCESS_TAG, code == 200 ? true : false);
            Add(MSG_TAG, msg);
            if (data != null)
            {
                Add(DATA_TAG, data);
            }
        }

        /// <summary>
        /// 返回默认成功消息（状态码200，消息"success"）
        /// </summary>
        /// <returns>包含成功状态的ApiResult对象</returns>
        public static ApiResult Success() { return new ApiResult(HttpStatus.SUCCESS, "success"); }

        /// <summary>
        /// 返回带数据的成功消息
        /// </summary>
        /// <param name="data">响应数据</param>
        /// <returns>包含成功状态和数据的ApiResult对象</returns>
        public static ApiResult Success(object data) { return new ApiResult(HttpStatus.SUCCESS, "success", data); }

        /// <summary>
        /// 返回带自定义消息的成功消息
        /// </summary>
        /// <param name="msg">自定义返回消息</param>
        /// <returns>包含成功状态和自定义消息的ApiResult对象</returns>
        public static ApiResult Success(string msg) { return new ApiResult(HttpStatus.SUCCESS, msg, null); }

        /// <summary>
        /// 返回带自定义消息和数据的成功消息
        /// </summary>
        /// <param name="msg">自定义返回消息</param>
        /// <param name="data">响应数据</param>
        /// <returns>包含成功状态、自定义消息和数据的ApiResult对象</returns>
        public static ApiResult Success(string msg, object data) { return new ApiResult(HttpStatus.SUCCESS, msg, data); }

        /// <summary>
        /// 返回带错误码的失败消息
        /// </summary>
        /// <param name="code">错误码枚举</param>
        /// <param name="msg">自定义错误消息，可选</param>
        /// <returns>包含错误状态的ApiResult对象</returns>
        public static ApiResult Error(ResultCode code, string msg = "")
        {
            return Error((int)code, msg);
        }

        /// <summary>
        /// 返回带状态码和消息的失败消息
        /// </summary>
        /// <param name="code">错误状态码</param>
        /// <param name="msg">错误消息</param>
        /// <returns>包含错误状态的ApiResult对象</returns>
        public static ApiResult Error(int code, string msg) { return new ApiResult(code, msg); }

        /// <summary>
        /// 返回带自定义消息的失败消息（默认错误码：自定义错误）
        /// </summary>
        /// <param name="msg">错误消息</param>
        /// <returns>包含错误状态的ApiResult对象</returns>
        public static ApiResult Error(string msg) { return new ApiResult((int)ResultCode.CUSTOM_ERROR, msg); }

        /// <summary>
        /// 判断当前响应是否为成功状态
        /// </summary>
        /// <returns>如果状态码为200则返回true，否则返回false</returns>
        public bool IsSuccess()
        {
            return HttpStatus.SUCCESS == (int)this[CODE_TAG];
        }

        /// <summary>
        /// 向响应中添加额外的键值对（支持链式调用）
        /// </summary>
        /// <param name="key">键名</param>
        /// <param name="value">值</param>
        /// <returns>当前ApiResult对象，支持链式调用</returns>
        public ApiResult Put(string key, object value)
        {
            Add(key, value);
            return this;
        }
    }
}